package tech.aistar.day01;

/**
 * 本类用来演示:数据类型的转换
 *
 * @author: success
 * @date: 2021/3/4 4:33 下午
 */
public class TypeChange {
    public static void main(String[] args) {
        //1. 强制类型转换
        int a = 100;

        //为甚需要进行转换
        //因为当JVM解释到这行代码的时候,它是不关心变量中具体存储的数据到底是多少
        //而仅仅是关注这个变量的数据类型.
        //既然是变量 - JVM就会认为变量a可以保存的数据的范围就是在int类型的可控范围之内浮动
        //-2^31~2^31-1
        //变量a,jvm就会认为变量a保存的数据有可能是int类型的范围的最大值.
        //认为会存在溢出的风险 - 检测到这种类型的不安全性
        //在编译期间就要进行类型的强制转换,为了避免在运行期出现这种风险.

        byte b = (byte) a;//alt+enter
        System.out.println("b:"+b);

        //2. 骚扰你一下
//        byte b1 = a;//编译会报错,要求进行类型的强制转换

        //java中看到一个整数默认的是int类型
        //JVM对待变量和字面量是不一样.

        //因为此处的100已经是一个字面量了,不是一个变量
        //JVM在编译期间,就会准确的判断出100必然是在byte类型可控的范围之内
        //所以允许在编译期间ok
        byte t = 100;//为啥是ok???

        long m = 123;//ok
        int x = (int) m;

        double d = 3.14;
        float f = (float) d;


        //自动类型转换
        byte b2 = 100;
        int t2 = b2;
        System.out.println(t2);

        //特殊的
        //int->double
        //但是int不能自动转成float
        int n = 123456789;
        float f1 = n;
        System.out.println("f1:"+f1);//1.23456792E8

        double d2 = n;
        System.out.println("d2:"+d2);//1.23456789E8

        //l/L  f/F  d/D
        // int类型+l/L  => 自动转换成  = >long
        //多此一举
        long u = 123L;

        //应用场景
        //Date date = new Date(3L*1000*9087*....*907*90982*9873*98752);

        float f2 = 3.24f;//double类型转换成float类型

        //纯粹是为了语义
        double d5 = 3.14d;
        System.out.println(d5);

    }
}
